package sgsi.controller.dao.impl;

import java.util.List;

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import sgsi.controller.dao.TipoDeArticuloDao;
import sgsi.model.entidades.TipoDeArticulo;

public class TipoDeArticuloDaoHibernateImpl extends HibernateDaoSupport
		implements TipoDeArticuloDao {

	private static final String BUSCAR_POR_CODIGOS = "select t from TipoDeArticulo t where t.estaBorrado is false and t.codigoTipoDeArticulo in ";	
	private static final String BUSCAR_POR_CODIGO = "select t from TipoDeArticulo t where t.estaBorrado is false and t.codigoTipoDeArticulo = ?";
	private static final String BUSCAR_TODOS = "select t from TipoDeArticulo t where t.estaBorrado is false and t.nombre like ";
	private static final String BUSCAR_DIFERENTES = "select t from TipoDeArticulo t where t.estaBorrado is false and t.codigoTipoDeArticulo != ";
	private static final String RANGO = " AND t.rangoDeTemperatura = ";
	private static final String AIRE_LIBRE = " AND t.aireLibre is true";
	private static final String ACCESO_RESTRINGIDO = " AND t.accesoRestringido is true";
	private static final String PERECEDERO = " AND t.perecedero is true";
	private static final String BUSCAR_TODOS_LOS_ACTIVOS = "select t from TipoDeArticulo t where t.estaBorrado is false";
	private static final String BUSCAR_TODOS_LOS_ACTIVOS_DIFERENTES_A = "select t from TipoDeArticulo t where t.estaBorrado is false and t.codigoTipoDeArticulo != ?";
	private static final String OBTENER_TODOS = "select t from TipoDeArticulo t where t.estaBorrado is false order by t.codigoTipoDeArticulo";

	@SuppressWarnings("unchecked")
	public List<TipoDeArticulo> obtenerTiposDeArticuloPorRangoDeTemperatura(int codigoRangoDeTemperatura, int codigoTipoDeArticulo) {
		String nuevaConsulta = BUSCAR_DIFERENTES + codigoTipoDeArticulo;
		nuevaConsulta = nuevaConsulta + RANGO + codigoRangoDeTemperatura;
		
		return getHibernateTemplate().find(nuevaConsulta);
	}
	
	@SuppressWarnings("unchecked")
	public List<TipoDeArticulo> obtenerTodosLosActivos() {
		return getHibernateTemplate().find(BUSCAR_TODOS_LOS_ACTIVOS);
	}

	@SuppressWarnings("unchecked")
	public List<TipoDeArticulo> obtenerTodosLosActivosDiferentesA(int codigo) {
		return getHibernateTemplate().find(BUSCAR_TODOS_LOS_ACTIVOS_DIFERENTES_A, codigo);
	}

	public TipoDeArticulo guardar(TipoDeArticulo tipoDeArticulo) {
		getHibernateTemplate().saveOrUpdate(tipoDeArticulo);
		return tipoDeArticulo;
	}

	@SuppressWarnings("unchecked")
	public List<TipoDeArticulo> obtenerTodos() {
		return getHibernateTemplate().find(OBTENER_TODOS);
	}

	@SuppressWarnings("unchecked")
	public TipoDeArticulo obtenerPorCodigo(int codigo) {
		List<TipoDeArticulo> resultado = getHibernateTemplate().find(BUSCAR_POR_CODIGO, codigo);
		
		if (resultado.isEmpty())
			return null;
		
		return resultado.get(0);		
	}

	@SuppressWarnings("unchecked")
	public List<TipoDeArticulo> obtenerTodosBusqueda(String nombre,
			int rangoSeleccionado, boolean aireLibre,
			boolean accesoRestringido, boolean perecedero) {
		
		String newQuery = BUSCAR_TODOS + "'%" + nombre + "%'";
		
		if(rangoSeleccionado !=0){
			newQuery = newQuery + RANGO + rangoSeleccionado;
		}
		
		if(accesoRestringido){
			newQuery = newQuery + ACCESO_RESTRINGIDO;
		}
		
		if(perecedero){
			newQuery = newQuery + PERECEDERO;
		}	
		
		if(aireLibre){
			newQuery = newQuery + AIRE_LIBRE;
		}			
		return getHibernateTemplate().find(newQuery);
	}

	@SuppressWarnings("unchecked")
	public List<TipoDeArticulo> obtenerTiposDeArticuloPorId(String[] codigos){
		StringBuffer query  = new StringBuffer(BUSCAR_POR_CODIGOS);
		query.append("(");
		for (int i=0; i<codigos.length; i++) {
			query.append("'").append(codigos[i]).append("'");
			if (i != codigos.length -1) {
				query.append(",");
			}
		}
		query.append(")");
		return getHibernateTemplate().find(query.toString());
	}	
}
